home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume9 / siotools / part02 < prev    next >
Encoding:
Text File  |  1989-12-04  |  33.2 KB  |  1,506 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v09i045: siotools part 2/2
  3. from: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  4. Reply-To: wht%n4hgf@gatech.edu (Warren Tucker)
  5.  
  6. Posting-number: Volume 9, Issue 45
  7. Submitted-by: wht%n4hgf@gatech.edu (Warren Tucker)
  8. Archive-name: siotools/part02
  9.  
  10. #!/bin/sh
  11. # This is a shell archive built by shar 3.03
  12. # Created Mon Dec  4 18:28:32 EST 1989 by gatech!kd4nc!n4hgf!wht
  13. # Source directory /u4/src/uusnap
  14. #
  15. # existing files WILL be overwriten
  16. #
  17. # This shar contains:
  18. #    siomon.c
  19. #    uusnap.c
  20. #
  21. touch 2>&1 | fgrep '[-amc]' > /tmp/s3_touch$$
  22. if [ -s /tmp/s3_touch$$ ]
  23. then
  24.     TOUCH=can
  25. else
  26.     TOUCH=cannot
  27. fi
  28. rm -f /tmp/s3_touch$$
  29. echo "x - extracting siomon.c (Text)"
  30. sed 's/^X//' << 'SHAR_EOF' > siomon.c &&
  31. X/* CHK=0x4E4E */
  32. Xchar *revision = "1.30";
  33. X/*+-------------------------------------------------------------------------
  34. X    siomon.c -- watch XENIX/UNIX serial I/O
  35. X    ...!gatech!kd4nc!n4hgf!wht
  36. X
  37. X    Sample output:
  38. X    000000000011111111112222222222333333333344444444445555555555666666666677777
  39. X    012345678901234567890123456789012345678901234567890123456789012345678901234
  40. X 00  siomon 1.2 (UNIX V.3.2/i386) n4hgf               delay:  1        21:54:54
  41. X 01    
  42. X 02     tty  raw  can   out   speed  state iflag  oflag  cflag  lflag  pgrp
  43. X 03     ---  ---  ---  -----  -----  ----- ------ ------ ------ ------ -----
  44. X 04     1a     0    0      0   9600  OC     10045      0   6655      0     0
  45. X 05     1b
  46. X 06     1c
  47. X 07     1d
  48. X 08     1e
  49. X 09     1f
  50. X 10     1g
  51. X 11     1h
  52. X 12     2a
  53. X 13     2b
  54. X 14     2c
  55. X 15     2d     0    0      0   9600  W          0      0   2275      0     0
  56. X 16     2e
  57. X 17     2f     0    0      0   4800  OC     10040      0   2374      0     0
  58. X 18     2g     0    0      0   4800  OC     10005      0   6374      0     0
  59. X 19     2h
  60. X 20    
  61. X 21    State: W waiting for open to complete  O open  C carrier on
  62. X 22           S stopped by XOFF  D delay timeout in progress
  63. X 23 Commands: + inc delay  - dec delay  ^L refresh  q quit  d detail
  64. X
  65. XUnder XENIX, termio.h is included twice (once by curses.h/tcap.h andf
  66. Xagain by sys/tty.h.  You need to bracket the termio.h under XENIX with
  67. X  #if !defined(TERMIO_HACK) || (defined(TERMIO_HACK) && !defined(IOCTYPE))
  68. X  ...
  69. X  #endif
  70. X
  71. X  Defined functions:
  72. X    detail()
  73. X    disp_delay()
  74. X    display_tod()
  75. X    disp_tty(y,sionum,tty)
  76. X    leave()
  77. X    main(argc,argv,envp)
  78. X    main_template()
  79. X
  80. X  Kudos to pyrnj.pyramid.com!romain (Romain Kang) for many suggestions
  81. X  regarding screen and CPU efficiency in the original itpmon.c for Pyramid
  82. X--------------------------------------------------------------------------*/
  83. X/*+:EDITS:*/
  84. X/*:12-04-1989-16:45-wht-add more to detail */
  85. X/*:11-28-1989-19:49-wht-no more sprintf and allow nap/rdchk in lieu of select */
  86. X/*:11-22-1989-12:33-wht-rehost my Pyramid itpmon.c */
  87. X
  88. X/* -------- select(S) availability --------- */
  89. X/* define HAVE_SELECT */ /* uncomment for XENIX/386 2.3.2 and later */
  90. X#if (defined(M_UNIX) && (!defined(HAVE_SELECT))) /* automatic for UNIX */
  91. X#define HAVE_SELECT
  92. X#endif
  93. X
  94. X#include <curses.h>
  95. X#include <signal.h>
  96. X#include <sys/types.h>
  97. X#include <sys/utsname.h>
  98. X#include <time.h>
  99. X
  100. X#if defined(HAVE_SELECT)
  101. X#include <sys/select.h>
  102. X#endif
  103. X
  104. X#define TERMIO_HACK /* for XENIX termio.h multiple inclusion problem */
  105. X#include <sys/tty.h>
  106. X
  107. X#include "wintty.h"
  108. X#include "kmemsio.h"
  109. X#include "utoa.h"
  110. X
  111. X#define HY 2    /* header line */
  112. X#define TX 1
  113. X#define RX 6
  114. X#define CX 11
  115. X#define OX 16
  116. X#define SX 23
  117. X#define FX 30
  118. X
  119. Xextern char _sobuf[];
  120. Xextern int errno;
  121. Xextern char *sys_errlist[];
  122. X
  123. Xint no_tod = 0;
  124. Xint delay_secs = 1;
  125. Xstruct utsname me;
  126. X
  127. X/*+-------------------------------------------------------------------------
  128. X    leave() - terminate curses, reset terminal and exit
  129. X--------------------------------------------------------------------------*/
  130. Xvoid
  131. Xleave()
  132. X{
  133. X    if(!stdscr)
  134. X    {
  135. X        nocrmode();
  136. X        echo();
  137. X        exit(0);
  138. X    }
  139. X    move(LINES - 1,0);
  140. X    refresh();
  141. X    endwin();
  142. X    exit(0);
  143. X}    /* end of leave */
  144. X
  145. X/*+-------------------------------------------------------------------------
  146. X    disp_tty(y,sionum,tty)
  147. X--------------------------------------------------------------------------*/
  148. Xvoid
  149. Xdisp_tty(y,sionum,tty)
  150. Xint y;
  151. Xint sionum;
  152. Xregister struct tty *tty;
  153. X{
  154. Xregister int xo = (sionum > 15) ? 40 : 0;    /* x offset */
  155. Xregister unsigned int itmp;
  156. Xregister opened = tty->t_state & (ISOPEN | WOPEN);
  157. Xchar s8[8];
  158. X
  159. X    move(y,TX + xo);
  160. X    addch((sionum < 8) ? '1' : '2');
  161. X    addch((sionum % 8) + 'a');
  162. X
  163. X    if(!opened)
  164. X    {
  165. X        clrtoeol();
  166. X        return;
  167. X    }
  168. X
  169. X    if((itmp = (unsigned)tty->t_rawq.c_cc) > 999)
  170. X        itmp = 999;
  171. X    utoda(s8,3,itmp);
  172. X    move(y,RX + xo);
  173. X    if(itmp > 10)
  174. X        standout();
  175. X    addstr(s8);
  176. X    if(itmp > 10)
  177. X        standend();
  178. X
  179. X    if((itmp = (unsigned)tty->t_canq.c_cc) > 999)
  180. X        itmp = 999;
  181. X    utoda(s8,3,itmp);
  182. X    move(y,CX + xo);
  183. X    addstr(s8);
  184. X
  185. X    if((itmp = (unsigned)tty->t_outq.c_cc + tty->t_tbuf.c_count) > 99999)
  186. X        itmp = 99999;
  187. X    utoda(s8,5,itmp);
  188. X    move(y,OX + xo);
  189. X    addstr(s8);
  190. X
  191. X    move(y,SX + xo);
  192. X    addstr(B_to_baud_rate(tty->t_cflag & CBAUD));
  193. X
  194. X    strcpy(s8,"     ");
  195. X    if(tty->t_state & WOPEN)
  196. X        s8[0] = 'W';
  197. X    else if(tty->t_state & ISOPEN)
  198. X        s8[0] = 'O';
  199. X    if(tty->t_state & CARR_ON)
  200. X        s8[1] = 'C';
  201. X    if(tty->t_state & BUSY)
  202. X        s8[2] = 'B';
  203. X    if(tty->t_state & TTSTOP)
  204. X        s8[3] = 'S';
  205. X    if(tty->t_state & TIMEOUT)
  206. X        s8[3] = 'D';
  207. X    move(y,FX + xo);
  208. X    addstr(s8);
  209. X
  210. X    utooa(s8,7,tty->t_iflag);
  211. X    addstr(s8);
  212. X
  213. X    utooa(s8,7,tty->t_oflag);
  214. X    addstr(s8);
  215. X
  216. X    utooa(s8,7,tty->t_cflag);
  217. X    addstr(s8);
  218. X
  219. X    utooa(s8,7,tty->t_lflag);
  220. X    addstr(s8);
  221. X
  222. X    utoda(s8,6,tty->t_pgrp);
  223. X    addstr(s8);
  224. X
  225. X}    /* end of disp_tty */
  226. X
  227. X/*+-------------------------------------------------------------------------
  228. X    disp_delay()
  229. X--------------------------------------------------------------------------*/
  230. Xvoid
  231. Xdisp_delay()
  232. X{
  233. Xchar dmsg[12];
  234. X
  235. X    move(0,50);
  236. X    addstr("delay: ");
  237. X    utoda(dmsg,2,delay_secs);
  238. X    addstr(dmsg);
  239. X}    /* end of disp_delay */
  240. X
  241. X/*+-------------------------------------------------------------------------
  242. X    display_tod()
  243. X--------------------------------------------------------------------------*/
  244. Xvoid
  245. Xdisplay_tod()
  246. X{
  247. Xregister struct tm *lt;        /* local time */
  248. Xstruct tm *localtime();
  249. Xlong now;
  250. Xchar buf[10];
  251. X
  252. X    if(no_tod)
  253. X        return;
  254. X
  255. X    time(&now);
  256. X    lt = localtime(&now);
  257. X    utoda_lz(buf,2,lt->tm_hour);
  258. X    buf[2] = ':';
  259. X    utoda_lz(buf + 3,2,lt->tm_min);
  260. X    buf[5] = ':';
  261. X    utoda_lz(buf + 6,2,lt->tm_sec);
  262. X    move(0,COLS - 13);
  263. X    addstr(buf);
  264. X}    /* end of display_tod */
  265. X
  266. X/*+-------------------------------------------------------------------------
  267. X    main_template()
  268. X--------------------------------------------------------------------------*/
  269. Xvoid
  270. Xmain_template()
  271. X{
  272. Xstatic char *header  = 
  273. X    " tty  raw  can   out   speed  state iflag  oflag  cflag  lflag  pgrp";
  274. Xstatic char *hyphens =
  275. X    " ---  ---  ---  -----  -----  ----- ------ ------ ------ ------ -----";
  276. XFILE *fp = fopen("/etc/systemid","r");
  277. Xchar sysid[32];
  278. X
  279. X    wclear(stdscr);
  280. X    move(0,0);
  281. X    standout();
  282. X    printw(" siomon %s (%s V.%s/%s)",
  283. X        revision,
  284. X#if defined(M_UNIX)
  285. X        "UNIX",
  286. X#else
  287. X        "XENIX",
  288. X#endif
  289. X        me.release,me.machine);
  290. X    if(fp)
  291. X    {
  292. X        sysid[0] = 0;
  293. X        fgets(sysid,sizeof(sysid),fp);
  294. X        if(sysid[0])
  295. X        {
  296. X            sysid[strlen(sysid) - 1] = 0;
  297. X            printw(" %s ",sysid);
  298. X        }
  299. X        fclose(fp);
  300. X    }
  301. X    standend();
  302. X    move(HY,0);
  303. X    addstr(header);
  304. X    move(HY + 1,0);
  305. X    addstr(hyphens);
  306. X    move(LINES - 4,0);
  307. X    addstr(
  308. X"State: W waiting for open to complete  O open  C carrier on");
  309. X    move(LINES - 3,0);
  310. X    addstr(
  311. X"       S stopped by XOFF  D delay timeout in progress ");
  312. X    move(LINES - 2,0);
  313. X    addstr(
  314. X"Commands: + inc delay  - dec delay  ^L refresh  q quit  d detail");
  315. X    move(LINES - 1,0);
  316. X    disp_delay();
  317. X    refresh();
  318. X}    /* end of main_template */
  319. X
  320. X/*+-------------------------------------------------------------------------
  321. X    detail()
  322. X--------------------------------------------------------------------------*/
  323. Xvoid
  324. Xdetail()
  325. X{
  326. Xint y,x;
  327. Xint sionum;
  328. Xchar tty_name[16];
  329. Xchar *cptr;
  330. Xchar cmd;
  331. Xint cmd_available;
  332. X#if defined(HAVE_SELECT)
  333. Xstruct timeval timeout;
  334. Xint readfds;
  335. X#else
  336. Xlong ltimeout;
  337. Xlong nap();
  338. X#endif
  339. X
  340. X    for(y = 0; y < 16; y++)
  341. X    {
  342. X        move(HY + 2 + y,0);
  343. X        clrtoeol();
  344. X    }
  345. X    move(HY + 2,0);
  346. X    addstr("display detail on /dev/tty__");
  347. X    getyx(stdscr,y,x);
  348. X    move(y,x - 2);
  349. X    refresh();
  350. X    resetty();
  351. X    getstr(tty_name);
  352. X    raw();
  353. X    noecho();
  354. X
  355. X    if((strlen(tty_name) == 2) &&
  356. X        ((tty_name[0] == '1') || (tty_name[0] == '2')))
  357. X        sionum = ((tty_name[0] - '1') * 8) + ((tty_name[1] & 7) - 1);
  358. X    else
  359. X    {
  360. X        fputc(7,stderr);
  361. X        goto DETAIL_EXIT;
  362. X    }
  363. X
  364. X    move(HY + 2 + 11,0);
  365. X    addstr("press ESC to return to main display (or -,+ delay cmds)");
  366. X
  367. X    move(HY + 2,0);
  368. X    clrtoeol();
  369. X    wintty_template(stdscr,HY + 2 + 2,0,1);
  370. X    while(1)
  371. X    {
  372. X        display_tod();
  373. X        kmem_read_tty(sionum,1);
  374. X        disp_tty(HY + 2,sionum,&sio[0]);
  375. X        wintty(stdscr,HY + 2 + 2,0,&sio[0]);
  376. X        move(HY + 2 + 11,0);
  377. X        refresh();
  378. X#if defined(HAVE_SELECT)
  379. X        readfds = 1;            /* for standard input */
  380. X        timeout.tv_sec  = delay_secs;
  381. X        timeout.tv_usec = (delay_secs) ? 0 : 100*1000L;
  382. X        cmd_available = (select(32,&readfds,0,0,&timeout) > 0);
  383. X#else
  384. X        ltimeout = (delay_secs) ? (delay_secs * 1000L) : 100L;
  385. X        while(ltimeout > 0)
  386. X        {
  387. X            ltimeout -= nap(100L);
  388. X            if(cmd_available = rdchk(0))
  389. X                break;
  390. X        }
  391. X#endif
  392. X        if(rdchk(0))
  393. X        {
  394. X            cmd = getch();
  395. X            if(cmd == 0x1B)
  396. X                break;
  397. X            switch(cmd)
  398. X            {
  399. X                case '+':
  400. X                    delay_secs++;
  401. X                    disp_delay();
  402. X                    break;
  403. X
  404. X                case '-':
  405. X                    if(!delay_secs)
  406. X                        break;
  407. X                    delay_secs--;
  408. X                    disp_delay();
  409. X                    break;
  410. X            }
  411. X        }
  412. X    }
  413. X
  414. XDETAIL_EXIT:
  415. X    main_template();
  416. X    refresh();
  417. X
  418. X}    /* end of detail */
  419. X
  420. X/*+-------------------------------------------------------------------------
  421. X    main(argc,argv,envp)
  422. X--------------------------------------------------------------------------*/
  423. Xmain(argc,argv,envp)
  424. Xint argc;
  425. Xchar **argv;
  426. Xchar **envp;
  427. X{
  428. Xregister sionum;
  429. Xchar *cptr;
  430. Xint cmd_available;
  431. X#if defined(HAVE_SELECT)
  432. Xstruct timeval timeout;
  433. Xint readfds;
  434. X#else
  435. Xlong ltimeout;
  436. Xlong nap();
  437. X#endif
  438. X
  439. X    if((argc > 1) && !strcmp(argv[1],"-n"))
  440. X        no_tod = 1;
  441. X
  442. X    signal(SIGINT,leave);
  443. X    signal(SIGTERM,leave);
  444. X    uname(&me);
  445. X
  446. X    setbuf(stdout,_sobuf);
  447. X    initscr();
  448. X    crmode();
  449. X    noecho();
  450. X    if(!stdscr)
  451. X    {
  452. X        fprintf(stderr,"curses init failed\n");
  453. X        nocrmode();
  454. X        echo();
  455. X        exit(1);
  456. X    }
  457. X    main_template();
  458. X
  459. X    move(4,0);
  460. X    standout();
  461. X    addstr("  initializing  ");
  462. X    if(cptr = kmem_init_tty())
  463. X    {
  464. X        move(4,0);
  465. X        addstr(cptr);
  466. X        leave();
  467. X    }
  468. X    standend();
  469. X    refresh();
  470. X
  471. X    move(4,0);
  472. X    addstr("                ");
  473. X
  474. X    while(1)
  475. X    {
  476. X        kmem_read_tty(0,16);
  477. X        for(sionum = 0; sionum < SIO_NTTY; sionum++)
  478. X            disp_tty(HY + 2 + (sionum & 15),sionum,&sio[sionum]);
  479. X        display_tod();
  480. X        move(LINES - 1,0);
  481. X        refresh();
  482. X
  483. X#if defined(HAVE_SELECT)
  484. X        readfds = 1;            /* for standard input */
  485. X        timeout.tv_sec  = delay_secs;
  486. X        timeout.tv_usec = (delay_secs) ? 0 : 100*1000L;
  487. X        cmd_available = (select(32,&readfds,0,0,&timeout) > 0);
  488. X#else
  489. X        ltimeout = (delay_secs) ? (delay_secs * 1000L) : 100L;
  490. X        while(ltimeout > 0)
  491. X        {
  492. X            ltimeout -= nap(100L);
  493. X            if(cmd_available = rdchk(0))
  494. X                break;
  495. X        }
  496. X#endif
  497. X
  498. X        if(cmd_available)
  499. X        {
  500. X        char ch;
  501. X            ch = getch();
  502. X            switch(ch & 0x7F)
  503. X            {
  504. X            case 'L' & 0x1F:        /* redraw screen */
  505. X            case 'R' & 0x1F:        /* redraw screen */
  506. X                main_template();
  507. X                continue;
  508. X
  509. X            case '+':
  510. X                delay_secs++;
  511. X                disp_delay();
  512. X                break;
  513. X
  514. X            case '-':
  515. X                if(!delay_secs)
  516. X                    break;
  517. X                delay_secs--;
  518. X                disp_delay();
  519. X                break;
  520. X
  521. X            case 'q':        /* quit */
  522. X            case 0x1B:
  523. X                leave();
  524. X                break;
  525. X
  526. X            case 'd':        /* detail */
  527. X                detail();
  528. X                break;
  529. X
  530. X            }
  531. X        }
  532. X    }
  533. X}    /* end of main */
  534. X
  535. X/* vi: set tabstop=4 shiftwidth=4: */
  536. X/* end of siomon.c */
  537. SHAR_EOF
  538. chmod 0644 siomon.c || echo "restore of siomon.c fails"
  539. if [ $TOUCH = can ]
  540. then
  541.     touch -m 1204182889 siomon.c
  542. fi
  543. echo "x - extracting uusnap.c (Text)"
  544. sed 's/^X//' << 'SHAR_EOF' > uusnap.c &&
  545. X/* CHK=0xB1F9 */
  546. Xchar *revision = "1.60";
  547. X/*+-------------------------------------------------------------------------
  548. X    uusnap.c - display UUCP communications status for HDB systems
  549. X    ...gatech!kd4nc!n4hgf!wht
  550. X
  551. X  Many ideas in this program came from uustatus.c by Ed Carp 
  552. X
  553. X  Defined functions:
  554. X    basename(fullname)
  555. X    bye(sig)
  556. X    cmd_line(text)
  557. X    datetime5(secs)
  558. X    detail()
  559. X    dir_close(dirp)
  560. X    dir_open(dirname)
  561. X    dir_read(dirp)
  562. X    display_status(sysnum,system_name,y,status_info)
  563. X    display_tod()
  564. X    display_tty(sionum,tty)
  565. X    get_status_info(system_name,buf,bufsize)
  566. X    lockpid_to_tty(lockpid)
  567. X    main(argc,argv)
  568. X    spooldirname(fname)
  569. X    statdirname(fname)
  570. X
  571. XUnder XENIX, termio.h is included twice (once by curses.h/tcap.h andf
  572. Xagain by sys/tty.h.  You need to bracket the termio.h under XENIX with
  573. X  #if !defined(TERMIO_HACK) || (defined(TERMIO_HACK) && !defined(IOCTYPE))
  574. X  ...
  575. X  #endif
  576. X
  577. X--------------------------------------------------------------------------*/
  578. X/*+:EDITS:*/
  579. X/*:12-04-1989-16:45-wht-add detail in full */
  580. X/*:12-01-1989-16:53-wht-XENIX 286 work: no beep()! */
  581. X/*:11-30-1989-17:48-wht-complete rewrite to add detail status */
  582. X
  583. X#include <curses.h>
  584. X#include <signal.h>
  585. X#include <time.h>
  586. X#include <sys/types.h>
  587. X#include <sys/stat.h>
  588. X#define TERMIO_HACK /* for XENIX termio.h multiple inclusion problem */
  589. X#include <sys/tty.h>
  590. X#include <sys/utsname.h>
  591. X#if defined(M_UNIX)
  592. X#include <sys/select.h>
  593. X#endif
  594. X
  595. X#include "wintty.h"
  596. X#include "kmemsio.h"
  597. X#include "utoa.h"
  598. X
  599. X#define FIRSTSYS_Y    4
  600. X#define NAME_X        4
  601. X#define RCNT_X        14
  602. X#define QCNT_X        19
  603. X#define LAST_X        24
  604. X#define NEXT_X        30
  605. X#define PID_X        36
  606. X#define STATUS_X    42
  607. X
  608. X/* display_tty x offsets */
  609. X#define TX 0
  610. X#define RX 5
  611. X#define CX 10
  612. X#define OX 15
  613. X#define SX 22
  614. X#define FX 29
  615. X
  616. Xextern char _sobuf[];
  617. Xextern int errno;
  618. Xextern char *sys_errlist[];
  619. X
  620. X#define DDIR FILE
  621. XDDIR *stat_dp;
  622. XDDIR *work_dp;
  623. Xstruct dent 
  624. X{
  625. X    unsigned short d_inode;
  626. X    char d_name[14];
  627. X};
  628. X
  629. Xlong secs_now;
  630. Xint systems;
  631. Xint no_tod = 0;
  632. Xchar sysnames[64 * 16];    /* sorta hack, but ka-plenty name space */
  633. Xchar locked_tty[16];
  634. X
  635. Xchar *STATUSDIR = "/usr/spool/uucp/.Status";
  636. Xchar *LOCKDIR = "/usr/spool/uucp/LCK..";
  637. Xchar *WORKDIR = "/usr/spool/uucp/";
  638. Xchar *SPOOLDIR = "/usr/spool/uucp";
  639. Xchar *LOGFILE = "/tmp/uuexp.log";
  640. X
  641. X#define MAX_SYSTEMS (LINES - FIRSTSYS_Y - 6)
  642. X#define WAITSECS_ACTIVE 1 /* sleep secs between samples when talking */
  643. X#define WAITSECS_IDLE   7 /* sleep secs between samples when not talking */
  644. X
  645. X#define SS_OK                    0     /* successful */
  646. X#define SS_NO_DEVICE             1     /* no device */
  647. X#define SS_TIME_WRONG            2     /* wrong time to call */
  648. X#define SS_TALKING               3     /* TALKING */
  649. X#define SS_CONVERSATION          4     /* conversation failed */
  650. X#define SS_SEQBAD                5     /* bad sequence check */
  651. X#define SS_LOGIN_FAILED          6     /* login failed */
  652. X#define SS_DIAL_FAILED           7     /* dial failed */
  653. X#define SS_BAD_LOG_MCH           8     /* bad login/machine */
  654. X#define SS_LOCKED_DEVICE         9     /* DEVICE LOCKED */
  655. X#define SS_ASSERT_ERROR          10    /* assert error */
  656. X#define SS_BADSYSTEM             11    /* system not in Systems */
  657. X#define SS_CANT_ACCESS_DEVICE    12    /* can't access device */
  658. X#define SS_DEVICE_FAILED         13    /* device failed */
  659. X#define SS_WRONG_MCH             14    /* wrong machine name */
  660. X#define SS_CALLBACK              15    /* callback required */
  661. X#define SS_RLOCKED               16    /* remote has lock for me */
  662. X#define SS_RUNKNOWN              17    /* remote does not know me */
  663. X#define SS_RLOGIN                18    /* remote reject after login */
  664. X#define SS_UNKNOWN_RESPONSE      19    /* remote reject, unknown msg */
  665. X#define SS_STARTUP               20    /* startup failed */
  666. X#define SS_CHAT_FAILED           21    /* caller script failed */
  667. X#if defined(M_XENIX) || defined(M_UNIX)
  668. X#define SS_CALL_IN_PROGRESS         22    /* CALL IN PROGRESS */
  669. X#define SS_CALL_FAILED           23    /* call failed (busy?) */
  670. X#else
  671. X#define SS_CALL_IN_PROGRESS         22    /* CALL IN PROGRESS */
  672. X#endif
  673. X
  674. Xstruct utsname me;
  675. Xint uucico_active;
  676. X
  677. Xchar *errortext[] =
  678. X{
  679. X    /*       00000000001111111111222222 */
  680. X    /*       01234567890123456789012346 */
  681. X    /* 0 */ "successful",
  682. X    /* 1 */ "no device",
  683. X    /* 2 */ "wrong time to call",
  684. X    /* 3 */ "TALKING",
  685. X    /* 4 */ "conversation failed",
  686. X    /* 5 */ "bad sequence check",
  687. X    /* 6 */ "login failed",
  688. X    /* 7 */ "dial failed",
  689. X    /* 8 */ "bad login/machine",
  690. X    /* 9 */ "DEVICE LOCKED",
  691. X    /* 10*/ "assert error",
  692. X    /* 11*/ "system not in Systems",
  693. X    /* 12*/ "can't access device",
  694. X    /* 13*/ "device failed",
  695. X    /* 14*/ "wrong machine name",
  696. X    /* 15*/ "callback required",
  697. X    /* 16*/ "remote has lock for me",
  698. X    /* 17*/ "remote does not know me",
  699. X    /* 18*/ "remote reject after login",
  700. X    /* 19*/ "remote reject, unknown msg",
  701. X    /* 20*/ "startup failed",
  702. X    /* 21*/ "caller script failed",
  703. X#if defined(M_XENIX) || defined(M_UNIX)
  704. X    /* 22*/ "CALL IN PROGRESS",
  705. X    /* 23*/ "call failed (busy?)",
  706. X#else
  707. X    /* 22*/ "CALL IN PROGRESS",
  708. X#endif
  709. X};
  710. X
  711. X#if defined(M_XENIX) || defined(M_UNIX)
  712. X#define SS_MSG_MAX 23
  713. X#else
  714. X#define SS_MSG_MAX 22
  715. X#endif
  716. X
  717. X/*+-------------------------------------------------------------------------
  718. X    dir_open(dirname)
  719. X--------------------------------------------------------------------------*/
  720. XDDIR *
  721. Xdir_open(dirname)
  722. Xchar *dirname;
  723. X{
  724. X    DDIR *fp = fopen(dirname,"r");
  725. X    return(fp);
  726. X}    /* end of dir_open */
  727. X
  728. X/*+-------------------------------------------------------------------------
  729. X    dir_read(dirname)
  730. X--------------------------------------------------------------------------*/
  731. Xstruct dent *
  732. Xdir_read(dirp)
  733. XDDIR *dirp;
  734. X{
  735. Xstatic struct dent_w_null { 
  736. X    struct dent dent; 
  737. X    int null;
  738. X} static_dent;
  739. X
  740. X
  741. X    do {
  742. X        if(fread((char *)&static_dent.dent,sizeof(struct dent),1,dirp) != 1)
  743. X            return((struct dent *)0);
  744. X    } while(!static_dent.dent.d_inode);
  745. X
  746. X    static_dent.null = 0;
  747. X    return(&static_dent.dent);
  748. X}    /* end of dir_open */
  749. X
  750. X/*+-------------------------------------------------------------------------
  751. X    dir_close(dirp)
  752. X--------------------------------------------------------------------------*/
  753. Xvoid
  754. Xdir_close(dirp)
  755. XDDIR *dirp;
  756. X{
  757. X    if(dirp)
  758. X        fclose(dirp);
  759. X}    /* end of dir_close */
  760. X
  761. X/*+-------------------------------------------------------------------------
  762. X    datetime5(secs) - return 5 char date or time string
  763. X
  764. Xneeds global 'secs_now' to reflect current time in "seconds since epoch"
  765. X(done by display_tod()); returns 5 character 'mm/dd' if time now is more
  766. Xthan 12 hours before now or 12 hours from now
  767. X--------------------------------------------------------------------------*/
  768. Xchar *
  769. Xdatetime5(secs)
  770. Xlong secs;
  771. X{
  772. Xregister long delta = secs_now - secs;
  773. Xstruct tm *lt = localtime(&secs);
  774. Xstatic char dt5[8];
  775. X
  776. X    if(delta < 0)
  777. X        delta = -delta;
  778. X
  779. X    if(delta > (12L * 3600))
  780. X    {
  781. X        utoda_lz(dt5,2,lt->tm_mon);
  782. X        dt5[2] = '/';
  783. X        utoda_lz(dt5 + 3,2,lt->tm_mday);
  784. X    }
  785. X    else
  786. X    {
  787. X        utoda_lz(dt5,2,lt->tm_hour);
  788. X        dt5[2] = ':';
  789. X        utoda_lz(dt5 + 3,2,lt->tm_min);
  790. X    }
  791. X
  792. X    return(dt5);
  793. X
  794. X}    /* end of datetime5 */
  795. X
  796. X/*+-------------------------------------------------------------------------
  797. X    basename(fullname) - strip directory name from filename
  798. X
  799. Xreturns address of static string
  800. X--------------------------------------------------------------------------*/
  801. Xchar *
  802. Xbasename(fullname)
  803. Xchar *fullname;
  804. X{
  805. Xregister char *start;
  806. Xstatic char outstr[256];
  807. Xchar *strrchr();
  808. X
  809. X    start = strrchr(fullname,'/'); /* find last slash */
  810. X    if(!start)
  811. X        return(fullname);
  812. X    start++;
  813. X    strcpy(outstr,start);
  814. X    return(outstr);
  815. X}    /* end of basename */
  816. X
  817. X/*+-------------------------------------------------------------------------
  818. X    statdirname(fname) - return base name prepended with status dir
  819. X
  820. Xreturns address of static string
  821. X--------------------------------------------------------------------------*/
  822. Xchar *
  823. Xstatdirname(fname)
  824. Xchar *fname;
  825. X{
  826. Xstatic char fullname[128];
  827. Xstatic int fullname_cat_point = 0;
  828. X
  829. X    if(!fullname_cat_point)
  830. X    {
  831. X        strcpy(fullname,STATUSDIR);
  832. X        strcat(fullname,"/");
  833. X        fullname_cat_point = strlen(fullname);
  834. X    }
  835. X
  836. X    strcpy(fullname + fullname_cat_point,fname);
  837. X    return(fullname);
  838. X
  839. X}    /* end of statdirname */
  840. X
  841. X/*+-------------------------------------------------------------------------
  842. X    spooldirname(fname) - return base name prepended with spool dir
  843. X
  844. Xreturns address of static string
  845. X--------------------------------------------------------------------------*/
  846. Xchar *
  847. Xspooldirname(fname)
  848. Xchar *fname;
  849. X{
  850. Xstatic char fullname[128];
  851. Xstatic int fullname_cat_point = 0;
  852. X
  853. X    if(!fullname_cat_point)
  854. X    {
  855. X        strcpy(fullname,SPOOLDIR);
  856. X        strcat(fullname,"/");
  857. X        fullname_cat_point = strlen(fullname);
  858. X    }
  859. X
  860. X    strcpy(fullname + fullname_cat_point,fname);
  861. X    return(fullname);
  862. X
  863. X}    /* end of statdirname */
  864. X
  865. X/*+-------------------------------------------------------------------------
  866. X    display_tod()
  867. X--------------------------------------------------------------------------*/
  868. Xvoid
  869. Xdisplay_tod()
  870. X{
  871. Xregister struct tm *lt;        /* local time */
  872. Xstruct tm *localtime();
  873. Xchar buf[10];
  874. X
  875. X    (void)time(&secs_now);
  876. X
  877. X    if(no_tod)
  878. X        return;
  879. X
  880. X    lt = localtime(&secs_now);
  881. X    utoda_lz(buf,2,lt->tm_hour);
  882. X    buf[2] = ':';
  883. X    utoda_lz(buf + 3,2,lt->tm_min);
  884. X    buf[5] = ':';
  885. X    utoda_lz(buf + 6,2,lt->tm_sec);
  886. X    move(0,COLS - 13);
  887. X    addstr(buf);
  888. X
  889. X}    /* end of display_tod */
  890. X
  891. X/*+-------------------------------------------------------------------------
  892. X    bye(sig) - exit cleanly
  893. X--------------------------------------------------------------------------*/
  894. Xvoid
  895. Xbye(sig)
  896. Xint sig;
  897. X{
  898. X    if(stdscr)
  899. X    {
  900. X        standend();
  901. X        move(LINES - 4,0);
  902. X        clrtobot();
  903. X        refresh();
  904. X        echo();
  905. X        noraw();
  906. X        move(LINES - 1,0);
  907. X        refresh();
  908. X        endwin();
  909. X    }
  910. X    exit(0);
  911. X}    /* end of bye */
  912. X
  913. X/*+-------------------------------------------------------------------------
  914. X    lockpid_to_tty(lockpid) - given pid, find first ttyname it has locked
  915. X--------------------------------------------------------------------------*/
  916. Xchar *
  917. Xlockpid_to_tty(lockpid)
  918. Xint lockpid;
  919. X{
  920. XDDIR *uspool_dp;
  921. Xstruct dent *dp;
  922. XFILE *fp;
  923. Xint testpid;
  924. Xstatic char rtnname[32];
  925. X
  926. X    if(uspool_dp = dir_open(SPOOLDIR))
  927. X    {
  928. X        while(dp = dir_read(uspool_dp))
  929. X        {
  930. X            if(strncmp(dp->d_name,"LCK..tty",8))
  931. X                continue;
  932. X            if(fp = fopen(spooldirname(dp->d_name),"r"))
  933. X            {
  934. X                fscanf(fp,"%d",&testpid);
  935. X                fclose(fp);
  936. X                if(testpid == lockpid)
  937. X                {
  938. X                    strcpy(rtnname,dp->d_name + 5);
  939. X                    dir_close(uspool_dp);
  940. X                    return(rtnname);
  941. X                }
  942. X            }
  943. X        }
  944. X        dir_close(uspool_dp);
  945. X    }
  946. X    return((char *)0);
  947. X}    /* end of lockpid_to_tty */
  948. X
  949. X/*+-------------------------------------------------------------------------
  950. X    cmd_line(text)
  951. X--------------------------------------------------------------------------*/
  952. Xcmd_line(text)
  953. Xchar *text;
  954. X{
  955. X    move(LINES - 4,0);
  956. X    clrtoeol();
  957. X
  958. X    if(!text)
  959. X        addstr(
  960. X        "type 'q' to quit, 'd' for detail, SPACE to update immediately");
  961. X    else
  962. X        addstr(text);
  963. X
  964. X}    /* end of cmd_line */
  965. X
  966. X/*+-------------------------------------------------------------------------
  967. X    get_status_info(system_name,buf,bufsize)
  968. X--------------------------------------------------------------------------*/
  969. Xint
  970. Xget_status_info(system_name,buf,bufsize)
  971. Xchar *system_name;
  972. Xchar *buf;
  973. Xint bufsize;
  974. X{
  975. XFILE *fp;
  976. X
  977. X    if(!(fp = fopen(statdirname(system_name),"r")))
  978. X        return(-1);
  979. X    buf[0] = 0;
  980. X    fgets(buf,bufsize,fp);
  981. X    fclose(fp);
  982. X    if(!buf[0])
  983. X        return(-1);
  984. X    buf[strlen(buf) - 1] = 0;
  985. X    return(0);
  986. X
  987. X}    /* end of get_status_info */
  988. X
  989. X/*+-------------------------------------------------------------------------
  990. X    display_status(sysnum,system_name,y,status_info)
  991. X
  992. Xcalled with status_info either .Status/<system_name> line or null
  993. Xif a tty is locked on the line, global locked_tty has "ttyxx"
  994. Xreturns -1 if status_info null and can't get it, else 0
  995. X--------------------------------------------------------------------------*/
  996. Xdisplay_status(sysnum,system_name,y,status_info)
  997. Xint sysnum;
  998. Xchar *system_name;
  999. Xint y;
  1000. Xchar *status_info;
  1001. X{
  1002. Xint itmp;
  1003. Xint retry_count;
  1004. Xint status;
  1005. Xint queue_count;
  1006. Xchar *stattxt;
  1007. Xint locking_pid;
  1008. Xchar *ttyname;
  1009. Xchar lock_name[64];
  1010. Xchar s32[32];
  1011. Xchar work_dir[64];
  1012. Xchar linebuf[512];
  1013. Xlong secs_last_try;
  1014. Xlong secs_next_try;
  1015. Xstruct dent *dp;
  1016. XFILE *fp;
  1017. X
  1018. X    if(!status_info)
  1019. X    {
  1020. X        status_info = linebuf;
  1021. X        if(get_status_info(system_name,status_info,sizeof(linebuf)))
  1022. X            return(-1);
  1023. X    }
  1024. X
  1025. X    sscanf(status_info,"%d %d %ld %ld",
  1026. X        &status,&retry_count,&secs_last_try,&secs_next_try);
  1027. X    secs_next_try += secs_last_try;    /* files has secs til next retry */
  1028. X
  1029. X    strcpy(work_dir,WORKDIR);
  1030. X    strcat(work_dir,system_name);
  1031. X
  1032. X    queue_count = 0;
  1033. X    if(work_dp = dir_open(work_dir))
  1034. X    {
  1035. X        /* count the number of C. queue_count */
  1036. X        while(dp = dir_read(work_dp))
  1037. X        {
  1038. X            if(!strncmp(dp->d_name,"C.",2))
  1039. X                queue_count++;
  1040. X            if(queue_count > 99)
  1041. X                break;
  1042. X        }
  1043. X        dir_close(work_dp);
  1044. X    }
  1045. X
  1046. X    /* "kludges for screwy status stuff with HDB" thanks to Ed Carp */
  1047. X    strcpy(lock_name,LOCKDIR);
  1048. X    strcat(lock_name,system_name);
  1049. X    if(!access(lock_name,0) && (status != SS_TALKING))
  1050. X        status = SS_CALL_IN_PROGRESS;
  1051. X    if(status == SS_BADSYSTEM)
  1052. X        status = SS_DEVICE_FAILED;
  1053. X
  1054. X    move(y,0);
  1055. X    utoda(s32,2,sysnum);
  1056. X    addstr(s32);
  1057. X    addch(' ');
  1058. X
  1059. X    strcpy(s32,system_name);
  1060. X    if(strlen(s32) > 10)
  1061. X        s32[10] = 0;
  1062. X    addstr(s32);
  1063. X
  1064. X    move(y,RCNT_X);
  1065. X    if(retry_count)
  1066. X    {
  1067. X        if(retry_count > 999)
  1068. X            retry_count = 999;
  1069. X        utoda(s32,3,retry_count);
  1070. X        addstr(s32);
  1071. X    }
  1072. X    else
  1073. X        addstr("   ");
  1074. X
  1075. X    move(y,QCNT_X);
  1076. X    if(queue_count)
  1077. X    {
  1078. X        if(queue_count > 99)
  1079. X            addstr(">99");
  1080. X        else
  1081. X        {
  1082. X            utoda(s32,3,queue_count);
  1083. X            addstr(s32);
  1084. X        }
  1085. X    }
  1086. X    else
  1087. X        addstr("   ");
  1088. X
  1089. X    move(y,LAST_X);
  1090. X    addstr(datetime5(secs_last_try));
  1091. X
  1092. X    move(y,NEXT_X);
  1093. X    addstr(datetime5(secs_next_try));
  1094. X
  1095. X    locking_pid = 0;
  1096. X    locked_tty[0] = 0;
  1097. X    move(y,PID_X);
  1098. X    addstr("     ");
  1099. X    ttyname = (char *)0;
  1100. X    if( (status == SS_TALKING) ||
  1101. X        (status == SS_LOCKED_DEVICE ) ||
  1102. X        (status == SS_CALL_IN_PROGRESS))
  1103. X    {
  1104. X        uucico_active = 1;
  1105. X        if(fp = fopen(lock_name,"r"))
  1106. X        {
  1107. X            fscanf(fp,"%d",&locking_pid);
  1108. X            fclose(fp);
  1109. X        }
  1110. X        if(locking_pid)
  1111. X        {
  1112. X            strcpy(locked_tty,ttyname = lockpid_to_tty(locking_pid));
  1113. X            move(y,PID_X);
  1114. X            utoda(s32,5,locking_pid);
  1115. X            addstr(s32);
  1116. X        }
  1117. X        standout();
  1118. X    }
  1119. X
  1120. X    move(y,STATUS_X);
  1121. X    if(status > SS_MSG_MAX)
  1122. X    {
  1123. X        stattxt = s32;
  1124. X        strcpy(stattxt,"status ");
  1125. X        utoda_lz(stattxt + 7,3,status);
  1126. X    }
  1127. X    else
  1128. X        stattxt = errortext[status];
  1129. X    addstr(stattxt);
  1130. X    if(ttyname)
  1131. X    {
  1132. X        addstr(" (");
  1133. X        addstr(ttyname);
  1134. X        addch(')');
  1135. X    }
  1136. X    standend();
  1137. X    itmp = 27 - strlen(stattxt);
  1138. X    while(itmp--)
  1139. X        addch(' ');
  1140. X    return(0);
  1141. X}    /* end of display_status */
  1142. X
  1143. X/*+-------------------------------------------------------------------------
  1144. X    display_tty(sionum,tty)
  1145. X--------------------------------------------------------------------------*/
  1146. Xvoid
  1147. Xdisplay_tty(sionum,tty)
  1148. Xint sionum;
  1149. Xregister struct tty *tty;
  1150. X{
  1151. Xregister int x;
  1152. Xregister int y;
  1153. Xregister unsigned int itmp;
  1154. Xchar s8[8];
  1155. X
  1156. X    getyx(stdscr,y,x);
  1157. X    move(y,TX + x);
  1158. X    addch((sionum < 8) ? '1' : '2');
  1159. X    addch((sionum % 8) + 'a');
  1160. X
  1161. X    if((itmp = (unsigned)tty->t_rawq.c_cc) > 999)
  1162. X        itmp = 999;
  1163. X    utoda(s8,3,itmp);
  1164. X    move(y,RX + x);
  1165. X    if(itmp > 10)
  1166. X        standout();
  1167. X    addstr(s8);
  1168. X    if(itmp > 10)
  1169. X        standend();
  1170. X
  1171. X    if((itmp = (unsigned)tty->t_canq.c_cc) > 999)
  1172. X        itmp = 999;
  1173. X    utoda(s8,3,itmp);
  1174. X    move(y,CX + x);
  1175. X    addstr(s8);
  1176. X
  1177. X    if((itmp = (unsigned)tty->t_outq.c_cc + tty->t_tbuf.c_count) > 99999)
  1178. X        itmp = 99999;
  1179. X    utoda(s8,5,itmp);
  1180. X    move(y,OX + x);
  1181. X    addstr(s8);
  1182. X
  1183. X    move(y,SX + x);
  1184. X    addstr(B_to_baud_rate(tty->t_cflag & CBAUD));
  1185. X
  1186. X    strcpy(s8,"     ");
  1187. X    if(tty->t_state & WOPEN)
  1188. X        s8[0] = 'W';
  1189. X    else if(tty->t_state & ISOPEN)
  1190. X        s8[0] = 'O';
  1191. X    if(tty->t_state & CARR_ON)
  1192. X        s8[1] = 'C';
  1193. X    if(tty->t_state & BUSY)
  1194. X        s8[2] = 'B';
  1195. X    if(tty->t_state & TTSTOP)
  1196. X        s8[3] = 'S';
  1197. X    if(tty->t_state & TIMEOUT)
  1198. X        s8[3] = 'D';
  1199. X    move(y,FX + x);
  1200. X    addstr(s8);
  1201. X
  1202. X    utooa(s8,7,tty->t_iflag);
  1203. X    addstr(s8);
  1204. X
  1205. X    utooa(s8,7,tty->t_oflag);
  1206. X    addstr(s8);
  1207. X
  1208. X    utooa(s8,7,tty->t_cflag);
  1209. X    addstr(s8);
  1210. X
  1211. X    utooa(s8,7,tty->t_lflag);
  1212. X    addstr(s8);
  1213. X
  1214. X    utoda(s8,6,tty->t_pgrp);
  1215. X    addstr(s8);
  1216. X
  1217. X}    /* end of display_tty */
  1218. X
  1219. X/*+-------------------------------------------------------------------------
  1220. X    detail()
  1221. X--------------------------------------------------------------------------*/
  1222. Xvoid
  1223. Xdetail()
  1224. X{
  1225. Xint y,x;
  1226. Xint sysdetail;
  1227. Xint ttnum;
  1228. Xchar *sysname;
  1229. Xchar *cptr;
  1230. X
  1231. Xstatic char *header  = 
  1232. X    "tty  raw  can   out   speed  state iflag  oflag  cflag  lflag  pgrp";
  1233. Xstatic char *hyphens =
  1234. X    "---  ---  ---  -----  -----  ----- ------ ------ ------ ------ -----";
  1235. X
  1236. X
  1237. X    cmd_line("display detail on system #: __");
  1238. X    getyx(stdscr,y,x);
  1239. X    move(y,x - 2);
  1240. X    refresh();
  1241. X    resetty();
  1242. X    x = scanw("%d",&sysdetail);
  1243. X    raw();
  1244. X    noecho();
  1245. X    sysdetail--;
  1246. X    if(!x || (sysdetail > systems))
  1247. X    {
  1248. X        fputc(7,stderr);
  1249. X        cmd_line((char *)0);
  1250. X        refresh();
  1251. X        return;
  1252. X    }
  1253. X
  1254. X    cmd_line("press any key to return to main display  ");
  1255. X    sysname = sysnames + (sysdetail << 4);
  1256. X    y = FIRSTSYS_Y;
  1257. X    move(y,0);
  1258. X    clrtobot();
  1259. X
  1260. X    move(y+4,0);
  1261. X    addstr(header);
  1262. X    move(y+5,0);
  1263. X    addstr(hyphens);
  1264. X    move(y+8,0);
  1265. X    addstr(
  1266. X"State: W waiting for open to complete  O open  C carrier on");
  1267. X    move(y+9,0);
  1268. X    addstr(
  1269. X"       S stopped by XOFF  D delay timeout in progress ");
  1270. X
  1271. X
  1272. X    while(1)
  1273. X    {
  1274. X        display_tod();    /* display time and get 'secs_now' */
  1275. X        if(display_status(sysdetail + 1,sysname,FIRSTSYS_Y,(char *)0))
  1276. X        {
  1277. X            move(y,0);
  1278. X            standout();
  1279. X            printw("cannot get status for %s",sysname);
  1280. X            standend();
  1281. X            clrtobot();
  1282. X            goto DETAIL_SLEEP;
  1283. X        }
  1284. X
  1285. X                            /* 00000 */
  1286. X                            /* 01234 */
  1287. X                            /* ttyxx */
  1288. X        move(y+6,0);
  1289. X        if(locked_tty[0] && ((locked_tty[3] == '1') || (locked_tty[3] == '2')))
  1290. X        {
  1291. X            ttnum = ((locked_tty[3] - '1') * 8) + ((locked_tty[4] & 7) - 1);
  1292. X            if(cptr = kmem_read_tty(ttnum,1))
  1293. X            {
  1294. X                standout();
  1295. X                addstr(cptr);
  1296. X                addstr(": ");
  1297. X                addstr(locked_tty);
  1298. X                cmd_line("press any key to return to main display  ");
  1299. X                standend();
  1300. X                refresh();
  1301. X                getch();
  1302. X                goto DETAIL_EXIT;
  1303. X            }
  1304. X            clrtoeol();
  1305. X            display_tty(ttnum,&sio[0]);
  1306. X            wintty_template(stdscr,y+11,0,1);
  1307. X            wintty(stdscr,y+11,0,&sio[0]);
  1308. X            move(y+11,0);
  1309. X        }
  1310. X        else
  1311. X        {
  1312. X            printw(" no tty or non-async connection");
  1313. X            clrtoeol();
  1314. X            wintty_template(stdscr,y+11,0,0);
  1315. X        }
  1316. X
  1317. XDETAIL_SLEEP:
  1318. X        refresh();
  1319. X        sleep(1);
  1320. X        if(rdchk(0))
  1321. X        {
  1322. X            getch();
  1323. X            break;
  1324. X        }
  1325. X    }
  1326. X
  1327. XDETAIL_EXIT:
  1328. X    move(y = FIRSTSYS_Y,0);
  1329. X    clrtobot();
  1330. X    cmd_line((char *)0);
  1331. X    refresh();
  1332. X
  1333. X}    /* end of detail */
  1334. X
  1335. X/*+-------------------------------------------------------------------------
  1336. X    main(argc,argv)
  1337. X--------------------------------------------------------------------------*/
  1338. Xmain(argc,argv)
  1339. Xint argc;
  1340. Xchar **argv;
  1341. X{
  1342. Xint display_delta_y;
  1343. Xchar s32[32];
  1344. Xchar linebuf[512];
  1345. Xchar *sysname;
  1346. Xchar *cptr;
  1347. Xchar cmd;
  1348. XFILE *fp;
  1349. Xstruct dent *dp;
  1350. X#if defined(M_UNIX)
  1351. Xstruct timeval timeout;
  1352. Xint fdmask;
  1353. X#else
  1354. Xlong nap();
  1355. Xlong timeout;
  1356. X#endif
  1357. X
  1358. X    if((argc > 1) && !strcmp(argv[1],"-n"))
  1359. X        no_tod = 1;
  1360. X
  1361. X    setbuf(stdout,_sobuf);
  1362. X
  1363. X    if(!initscr())
  1364. X    {
  1365. X        fprintf(stderr,"curses init failed... check terminal type\n");
  1366. X        exit(0);
  1367. X    }
  1368. X    savetty();
  1369. X    noecho();
  1370. X    raw();
  1371. X
  1372. X    signal(SIGTERM,bye);
  1373. X    signal(SIGINT,bye);
  1374. X    signal(SIGHUP,bye);
  1375. X
  1376. X    uname(&me);
  1377. X    cmd_line((char *)0);
  1378. X
  1379. X    move(0,0);
  1380. X    standout();
  1381. X    printw(" uusnap %s (%s V.%s/%s)",
  1382. X        revision,
  1383. X#if defined(M_UNIX)
  1384. X        "UNIX",
  1385. X#else
  1386. X        "XENIX",
  1387. X#endif
  1388. X        me.release,me.machine);
  1389. X    if(fp = fopen("/etc/systemid","r"))
  1390. X    {
  1391. X        s32[0] = 0;
  1392. X        fgets(s32,sizeof(s32),fp);
  1393. X        if(s32[0])
  1394. X        {
  1395. X            s32[strlen(s32) - 1] = 0;
  1396. X            printw(" %s ",s32);
  1397. X        }
  1398. X        fclose(fp);
  1399. X    }
  1400. X    standend();
  1401. X
  1402. X    move(2,0);
  1403. X    standout();
  1404. X    addstr(" initializing ");
  1405. X    refresh();
  1406. X    if(cptr = kmem_init_tty())
  1407. X    {
  1408. X        move(2,0);
  1409. X        addstr(cptr);
  1410. X        bye(255);
  1411. X    }
  1412. X    standend();
  1413. X
  1414. X    move(2,0);
  1415. X    addstr(" # SYSTEM     RCNT QCNT LAST  NEXT   PID  STATUS");
  1416. X    move(3,0);
  1417. X    addstr("-- ------     ---- ---- ----  ----   ---  ------");
  1418. X    while(1)
  1419. X    {
  1420. X        uucico_active = 0;        /* assume no uucico_active connections */
  1421. X        display_tod();    /* display time and get 'secs_now' */
  1422. X
  1423. X        if(!(stat_dp = dir_open(statdirname("."))))
  1424. X        {
  1425. X            move(6,0);
  1426. X            printw("%s: %s",STATUSDIR,sys_errlist[errno]);
  1427. X            move(7,0);
  1428. X            addstr("I don't think HoneyDanBer UUCP is installed.");
  1429. X            bye(255);
  1430. X        }
  1431. X        display_delta_y = systems = 0;
  1432. X        move(LINES - 4,0);
  1433. X        move(FIRSTSYS_Y,0);
  1434. X        while(dp = dir_read(stat_dp))
  1435. X        {
  1436. X            if(display_delta_y > MAX_SYSTEMS)
  1437. X                break;
  1438. X            if(*dp->d_name == '.')
  1439. X                continue;
  1440. X            if(get_status_info(dp->d_name,linebuf,sizeof(linebuf)))
  1441. X                continue;
  1442. X
  1443. X            sysname = sysnames + (systems++ << 4);
  1444. X            strcpy(sysname,dp->d_name);
  1445. X
  1446. X            display_status(systems,sysname,display_delta_y + FIRSTSYS_Y,linebuf);
  1447. X            display_delta_y++;
  1448. X        }
  1449. X        display_delta_y++;
  1450. X        move(display_delta_y + FIRSTSYS_Y,0);
  1451. X        addstr("UUCP connections active: ");
  1452. X        utoda(s32,2,systems);
  1453. X        addstr(s32);
  1454. X        display_delta_y++;
  1455. X        while(display_delta_y < MAX_SYSTEMS)
  1456. X        {
  1457. X            move(display_delta_y++ + FIRSTSYS_Y,0);
  1458. X            clrtoeol();
  1459. X        }
  1460. X
  1461. X        dir_close(stat_dp);
  1462. X        move(LINES - 4,0);
  1463. X        refresh();
  1464. X
  1465. X#if defined(M_UNIX)
  1466. X        timeout.tv_sec = (uucico_active) ? WAITSECS_ACTIVE : WAITSECS_IDLE;
  1467. X        timeout.tv_usec = 0;
  1468. X        fdmask = 1 << 0;
  1469. X        select(32,&fdmask,(int *)0,(int *)0,&timeout);
  1470. X#else
  1471. X        timeout = ((uucico_active) ? WAITSECS_ACTIVE : WAITSECS_IDLE) * 1000L;
  1472. X        while(timeout > 0)
  1473. X        {
  1474. X            timeout -= nap(200L);
  1475. X            if(rdchk(0))
  1476. X                break;
  1477. X        }
  1478. X#endif
  1479. X
  1480. X        if(rdchk(0))
  1481. X        {
  1482. X            read(0,&cmd,1);
  1483. X            cmd &= 0x7f;
  1484. X            switch(cmd &= 0x7f)
  1485. X            {
  1486. X                case 'q':
  1487. X                    bye(0);
  1488. X                case 'd':
  1489. X                    detail();
  1490. X                    break;
  1491. X            }
  1492. X        }
  1493. X    }
  1494. X}    /* end of main */
  1495. X
  1496. X/* vi: set tabstop=4 shiftwidth=4: */
  1497. X/* end of uusnap.c */
  1498. SHAR_EOF
  1499. chmod 0644 uusnap.c || echo "restore of uusnap.c fails"
  1500. if [ $TOUCH = can ]
  1501. then
  1502.     touch -m 1204182889 uusnap.c
  1503. fi
  1504. exit 0
  1505.  
  1506.